package com.example.demo.mqserver.core;

/**
 * Created with IntelliJ IDEA.
 * Description
 * User: 杰
 * Date: 2023 -07 -29
 * Time: 17:37
 */

import java.io.Serializable;
import java.util.Arrays;
import java.util.UUID;

/**
 * 该类表示一个要传递的消息
 * 此处的 Message 对象, 是需要能够在网络上进行传输, 并且也需要能写入到文件中.
 * 此时就需要针对 Message 进行序列化和反序列化.
 * 使用标准库自带的 序列化 / 反序列化 操作.
 */
public class Message implements Serializable {
    // 这两个属性是 Message 最核心的部分.(在这里去new 对象, 是为了不让下面的getMessageId方法有空指针)
    private BasicProperties basicProperties = new BasicProperties(); // 属性
    private byte[] body; // 正文

    // 下面的属性是辅助属性
    // Message 后序会存储到文件中 (如果持久化的话)
    // 一个文件中会存储很多消息, 如何找到某个消息 --> 使用偏移量
    // 这里约定是 [offsetBeg,offsetEnd) , 并且以下这两个属性不需要被序列化 (加上 transient)
    // 存在的目的就是为了让内存中的 Message 对象, 能够快速找到对应的硬盘上的 Message 的位置.
    private transient long offsetBeg = 0; // 消息数据的开头距离文件开头的位置偏移(字节)
    private transient long offsetEnd = 0; // 消息数据的结尾距离文件开头的位置偏移(字节)
    // 使用这个属性表示该消息在文件中是否是有效消息. (逻辑删除)
    // 0x1 表示有效, 0x0 表示无效
    private byte isValid = 0x1;

    // 创建一个工厂方法, 使用工厂方法封装一下创建 Message 对象的过程.
    // 这个方法中创建的 Message 对象, 会自动生成唯一的 MessageId.
    // 如果 routingKey 和 basicProperties 里的 routingKey 冲突, 则以外面的为主.
    public static Message createMessageWithId(String routingKey, BasicProperties basicProperties, byte[] body) {
        Message message = new Message();
        if (basicProperties != null) {
            message.setBasicProperties(basicProperties);
        }
        // 此处生成的MessageId 以 M- 作为前缀.
        message.setMessageId("M-" + UUID.randomUUID());
        message.setRoutingKey(routingKey);
        message.body = body;
        return message;
    }

    // 获取到消息Id
    public String getMessageId() {
        return basicProperties.getMessageId();
    }
    // 设置 MessageId
    public void setMessageId(String messageID) {
        basicProperties.setMessageId(messageID);
    }

    // 获取到 RoutingKey
    public String getRoutingKey() {
        return basicProperties.getRoutingKey();
    }
    // 设置 RoutingKey
    public void setRoutingKey(String routingKey) {
        basicProperties.setRoutingKey(routingKey);
    }

    // 是否持久化 1为不持久化, 2为持久化
    public int getDeliverMode() {
        return basicProperties.getDeliverMode();
    }
    // 进行设置持久化
    public void setDeliverMode(int mode) {
        basicProperties.setDeliverMode(mode);
    }

    public BasicProperties getBasicProperties() {
        return basicProperties;
    }

    public void setBasicProperties(BasicProperties basicProperties) {
        this.basicProperties = basicProperties;
    }

    public byte[] getBody() {
        return body;
    }

    public void setBody(byte[] body) {
        this.body = body;
    }

    public long getOffsetBeg() {
        return offsetBeg;
    }

    public void setOffsetBeg(long offsetBeg) {
        this.offsetBeg = offsetBeg;
    }

    public long getOffsetEnd() {
        return offsetEnd;
    }

    public void setOffsetEnd(long offsetEnd) {
        this.offsetEnd = offsetEnd;
    }

    public byte getIsValid() {
        return isValid;
    }

    public void setIsValid(byte isValid) {
        this.isValid = isValid;
    }

    @Override
    public String toString() {
        return "Message{" +
                "basicProperties=" + basicProperties +
                ", body=" + Arrays.toString(body) +
                ", offsetBeg=" + offsetBeg +
                ", offsetEnd=" + offsetEnd +
                ", isValid=" + isValid +
                '}';
    }
}

















